import axios, {
  AxiosInstance,
  AxiosRequestConfig,
  AxiosResponse,
  InternalAxiosRequestConfig
} from 'axios';
import { ElMessage } from 'element-plus';
import { BASE_URL, API_TIMEOUT, API_CODE, ERROR_MESSAGE } from '@/api/constant';
import Cookies from 'js-cookie';
import router from '@/router';

// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL: BASE_URL,
  timeout: API_TIMEOUT,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 添加token到请求头
    const token = Cookies.get('token');
    if (token && config.headers) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    console.error('Request error:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data;

    // 如果返回的状态码不是200，说明接口请求有误
    if (res.code !== API_CODE.SUCCESS) {
      // 错误提示
      ElMessage({
        message: res.message || ERROR_MESSAGE.DEFAULT,
        type: 'error',
        duration: 3000
      });

      // 未授权重定向到登录页
      if (res.code === API_CODE.UNAUTHORIZED) {
        // 清除cookie
        Cookies.remove('token');
        Cookies.remove('userInfo');

        // 重定向到登录页
        router.push('/login');
      }

      return Promise.reject(new Error(res.message || ERROR_MESSAGE.DEFAULT));
    } else {
      return res;
    }
  },
  error => {
    console.error('Response error:', error);

    // 根据错误类型显示不同的错误提示
    let message = ERROR_MESSAGE.DEFAULT;

    if (error.response) {
      // 请求已发出，但服务器响应的状态码不在 2xx 范围内
      switch (error.response.status) {
        case API_CODE.UNAUTHORIZED:
          message = ERROR_MESSAGE.UNAUTHORIZED;
          // 清除cookie
          Cookies.remove('token');
          Cookies.remove('userInfo');
          // 重定向到登录页
          router.push('/login');
          break;
        case API_CODE.FORBIDDEN:
          message = ERROR_MESSAGE.FORBIDDEN;
          break;
        case API_CODE.NOT_FOUND:
          message = ERROR_MESSAGE.NOT_FOUND;
          break;
        case API_CODE.SERVER_ERROR:
          message = ERROR_MESSAGE.SERVER_ERROR;
          break;
        default:
          message = error.response.data?.message || ERROR_MESSAGE.DEFAULT;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      message = ERROR_MESSAGE.NETWORK_ERROR;
    } else {
      // 请求时发生错误
      message = error.message || ERROR_MESSAGE.DEFAULT;
    }

    // 显示错误提示
    ElMessage({
      message,
      type: 'error',
      duration: 3000
    });

    return Promise.reject(error);
  }
);

/**
 * GET请求
 * @param url 请求地址
 * @param params 请求参数
 * @param config 请求配置
 */
export function get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.get(url, { params, ...config });
}

/**
 * POST请求
 * @param url 请求地址
 * @param data 请求数据
 * @param config 请求配置
 */
export function post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.post(url, data, config);
}

/**
 * PUT请求
 * @param url 请求地址
 * @param data 请求数据
 * @param config 请求配置
 */
export function put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.put(url, data, config);
}

/**
 * DELETE请求
 * @param url 请求地址
 * @param params 请求参数
 * @param config 请求配置
 */
export function del<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.delete(url, { params, ...config });
}

export default service;
